package logic.service;

import dao.ProjectDAO;
import dao.TaskDAO;
import entity.Project;
import entity.Task;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import vo.IValueObject;
import vo.TaskVO;

/**
 *
 * @author Alexander
 */
public class TaskService implements IService {

    @Override
    public void persist(IValueObject vo, EntityManager em) {
        Task entity = new Task();
        entity.setId(((TaskVO) vo).getId());
        entity.setName(((TaskVO) vo).getName());
        entity.setDetails(((TaskVO) vo).getDetails());
        entity.setPriority(((TaskVO) vo).getPriority());
        entity.setState(((TaskVO) vo).getCurrentState());
        entity.setStartDate(((TaskVO) vo).getStartDate());
        entity.setDeadlineDate(((TaskVO) vo).getDeadlineDate());

        int projectID = ((TaskVO) vo).getProjectId();
        Project proj = (Project) (new ProjectDAO().find(projectID, em));
        entity.setProject(proj);
        proj.getTasks().add(entity);

        new TaskDAO().persist(entity, em);
    }

    @Override
    public IValueObject find(Object id, EntityManager em) {
        Task t = (Task) new TaskDAO().find(id, em);
        if (t != null) {
            return t.toVO();
        } else {
            return null;
        }
    }

    @Override
    public void update(IValueObject vo, EntityManager em) {
        Task entity = new Task();
        entity.setId(((TaskVO) vo).getId());
        entity.setName(((TaskVO) vo).getName());
        entity.setDetails(((TaskVO) vo).getDetails());
        entity.setPriority(((TaskVO) vo).getPriority());
        entity.setState(((TaskVO) vo).getCurrentState());
        entity.setStartDate(((TaskVO) vo).getStartDate());
        entity.setDeadlineDate(((TaskVO) vo).getDeadlineDate());

        Project project = (Project) new ProjectDAO().find(((TaskVO) vo).getProjectId(), em);
        entity.setProject(project);
//        if (!project.getTasks().contains(entity)) {
//            project.getTasks().add(entity);
//        }

        new TaskDAO().update(entity, em);
    }

    @Override
    public void delete(Object id, EntityManager em) {
        new TaskDAO().delete(id, em);
    }

    @Override
    public List<IValueObject> getList(EntityManager em) {
        List<IValueObject> taskVO = new ArrayList<>();
        for (Object task : new TaskDAO().getList(em)) {
            taskVO.add(((Task) task).toVO());
        }
        return taskVO;
    }

    public List<TaskVO> getTasksByCalendar(Object id, EntityManager em) {
        List<Project> projects = new ArrayList<>();
        List<TaskVO> taskVo = new ArrayList<>();
        try {
            projects = new ProjectDAO().getProjectsByCalendar(id, em);
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (Project p : projects) {
            for (Task t : p.getTasks()) {
                taskVo.add(t.toVO());
            }
        }
        return taskVo;
    }

    public List<TaskVO> getTasksByDate(Date date, EntityManager em) {
        List<TaskVO> taskVO = new ArrayList<>();
        for (Task task : new TaskDAO().getTaskByDate(date, em)) {
            taskVO.add(task.toVO());
        }
        return taskVO;
    }
}
